package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import co.gov.medellin.ssti.sub.model.dao.IBeneficioDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.Beneficiario_AtributoVO;
import co.gov.medellin.ssti.sub.model.vo.BeneficioVO;
import co.gov.medellin.ssti.sub.model.vo.UsuarioxSedeVO;
import co.gov.medellin.ssti.sub.service.AtributosService;
import co.gov.medellin.ssti.sub.service.SubprogramaService;

public class BeneficioDAOImpl extends BaseDAOImpl implements IBeneficioDAO {
	private static final String QUERY_EXISTE_BENEFICIARIO = "SELECT CODIGO FROM TCS_BEN_BENEFICIO_OTORGADO "
			+ " WHERE BEN_CODIGO = ? AND SBPR_CODIGO = ? "
			+ " AND campo_a1 IS NULL";

	private static final String SELECT_VALOR_BY_CODEBOT = "SELECT VALOR FROM VCS_BENEFICIOS_OTORGADOS "
			+ " WHERE CODBOT = ? ";

	private static final String SELECT_FECHA_BOT_BY_CODEBOT = "SELECT TO_CHAR(TO_DATE(fecha, 'dd/mm/rrrr'), 'dd/mm/rrrr') fechaBOT "
			+ " FROM VCS_BENEFICIOS_OTORGADOS " + "WHERE CODBOT = ?";

	private static final String SELECT_TERCERO_BOT_BY_CODEBOT = "SELECT trim(TERCERO) tercero "
			+ " FROM TCS_BEN_BENEFICIO_OTORGADO WHERE CODIGO = ?";

	private static final String SELECT_TIPO_BENEFICIO_BOT_BY_CODEBOT = "SELECT TRIM(TIPO_BENEFICIO) tipo "
			+ " FROM TCS_BEN_BENEFICIO_OTORGADO WHERE CODIGO = ?";

	private static final String SELECT_NUMERO_BEN_DISPONIBLE = "SELECT NUMERO_BEN_DISPONIBLE "
			+ " FROM TCS_BEN_SUBPROGRAMA_SEDE WHERE SEDE_CODIGO = ? "
			+ " AND SBPR_CODIGO = ?";

	public BeneficioDAOImpl(Connection con) {
		super(con);
	}

	public boolean isExisteBeneficiario(Long codeBeneficiario,
			Long codeSubprograma) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		try {
			pstmt = conn.prepareStatement(QUERY_EXISTE_BENEFICIARIO);
			pstmt.setLong(1, codeBeneficiario.longValue());
			pstmt.setLong(2, codeSubprograma.longValue());
			rst = pstmt.executeQuery();
			return rst.next() ? true : false;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public String findCostoBeneficio(Long codeBeneficio) throws DAOException {
		String query = "SELECT NVL(TRUNC(VALOR_UNITARIO_BENEFICIO),0) VALOR_UNITARIO_BENEFICIO FROM TCS_BEN_SUBPROGRAMA "
				+ "WHERE CODIGO = ? ";
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strCost = null;
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codeBeneficio.longValue());
			rst = pstmt.executeQuery();
			if (rst.next()) {
				strCost = rst.getString("VALOR_UNITARIO_BENEFICIO");
			} else {
				strCost = "0";
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return strCost;
	}

	public String findCostoBOT(Long codeBot) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strCost = null;
		try {
			pstmt = conn.prepareStatement(SELECT_VALOR_BY_CODEBOT);
			pstmt.setLong(1, codeBot.longValue());
			rst = pstmt.executeQuery();
			if (rst.next()) {
				strCost = "" + rst.getInt("VALOR");
			} else {
				// TODO: no es mejor retornar sqlException o algun mensaje de no
				// rows returned?
				strCost = "0";
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return strCost;
	}

	public String findFechaBOT(Long codeBot) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strFecha = null;
		try {
			pstmt = conn.prepareStatement(SELECT_FECHA_BOT_BY_CODEBOT);
			pstmt.setLong(1, codeBot.longValue());
			rst = pstmt.executeQuery();
			if (rst.next()) {
				strFecha = rst.getString("fechaBOT");
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return strFecha;
	}

	public String findTercero(Long codeBot) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strTercero = null;
		try {
			pstmt = conn.prepareStatement(SELECT_TERCERO_BOT_BY_CODEBOT);
			pstmt.setLong(1, codeBot.longValue());
			rst = pstmt.executeQuery();
			if (rst.next()) {
				strTercero = rst.getString("tercero");
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return strTercero;
	}

	public String findTipoBeneficio(Long codeBot) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strTipo = null;
		try {
			pstmt = conn.prepareStatement(SELECT_TIPO_BENEFICIO_BOT_BY_CODEBOT);
			System.out.println("findTipoBeneficio " + SELECT_TIPO_BENEFICIO_BOT_BY_CODEBOT);
			pstmt.setLong(1, codeBot.longValue());
			rst = pstmt.executeQuery();
			if (rst.next()) {
				strTipo = rst.getString("tipo");
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return strTipo;
	}

	public int findDisponibilidad(Long codeSede, Long codeSubprograma)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		int retorno = 0;
		try {
			pstmt = conn.prepareStatement(SELECT_NUMERO_BEN_DISPONIBLE);
			pstmt.setLong(1, codeSede.longValue());
			pstmt.setLong(2, codeSubprograma.longValue());
			rst = pstmt.executeQuery();
			if (rst.next()) {
				retorno = rst.getInt("NUMERO_BEN_DISPONIBLE");
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return retorno;
	}

	public boolean otorgarBeneficios(Long codeSede, Long codeSubprograma,
			Long codeBeneficiario,
			List<Beneficiario_AtributoVO> lListaInsertar, String tercero,
			int i, String[] strArrIns, String costoBeneficio,
			String fechaBeneficio) throws DAOException {
		boolean retorno = true;

		boolean cantidad = checkBeneficio(codeSede, codeSubprograma);
		// boolean vigenciaSede = checkVigencia(codeSede, codeSubpro);
		boolean sw = false;
		String strCodeSede = codeSede + "";
		String strCodeSubpro = codeSubprograma + "";
		String strCodeBeneficiario = codeBeneficiario + "";

		if (cantidad) {
			int tamanoinsert = lListaInsertar.size();

			// proceso para insertar en la tabla beneficio otorgado
			String strArr[] = { strCodeSubpro, strCodeBeneficiario,
					strCodeSede, tercero, costoBeneficio, strArrIns[0],
					strArrIns[1], strArrIns[0], strArrIns[1] };

			// subProgramaDAO = new SubprogramaDAOImpl();
			SubprogramaService subprogramaService = new SubprogramaService();
			int insertbienBeneOtorgado = subprogramaService
					.insertBeneficioOtorgado(strArr, i, fechaBeneficio);
			// fin del proceso

			if (tercero == null) {
				sw = true;
			} else {
				if (tercero.equals("")) {
					sw = true;
				}
			}

			// Proceso para actualizar la cantidad disponible
			if (sw) {
				updateBeneficioDisponible(codeSede, codeSubprograma);
			}
			// fin del proceso

			// proceso para calcular el codigo maximo en la tabla beneficio
			// otorgado
			String codMaxBenefOtor = new SubprogramaService()
					.findCodMaxBenOtor();
			// fin del proceso

			AtributosService atributosService = new AtributosService();
			for (int j = 0; j < tamanoinsert; j++) {
				Beneficiario_AtributoVO objBenAtri = (Beneficiario_AtributoVO) lListaInsertar
						.get(j);

				if (objBenAtri.getVariable().trim().equals("") == false) {
					System.err
							.println("[BeneficioDAO.OtorgarBeneficios]tipo atributo="
									+ objBenAtri.getTipoatributo());
					if ((objBenAtri.getTipoatributo()).equals("R")) {
						int insertobeneficiarioatri = atributosService
								.insertBeneficiarioAtri(
										objBenAtri.getVariable().trim(),
										objBenAtri.getTipodato(),
										new Long(objBenAtri.getCodigoatributo()),
										new Long(objBenAtri
												.getCodbeneficiario()), i,
										strArrIns);
					} else {
						int insertobeneficioatri = atributosService
								.insertBeneficioAtri(
										objBenAtri.getVariable().trim(),
										objBenAtri.getTipodato(),
										new Long(objBenAtri.getCodigoatributo()),
										new Long(codMaxBenefOtor), i, strArrIns);
					}
				}
			}
		} else {
			return retorno = false;
		}
		return retorno;
	}

	public boolean otorgarBeneficios(Long codeSede, Long codeSubprograma,
			Long codeBeneficiario,
			List<Beneficiario_AtributoVO> lListaInsertar, String tercero,
			int i, String[] strArrIns, String costoBeneficio,
			String fechaBeneficio, String tipoBeneficio) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		boolean retorno = true;

		boolean cantidad = checkBeneficio(codeSede, codeSubprograma);
		// boolean vigenciaSede = checkVigencia(codeSede, codeSubpro);
		boolean sw = false;
		String strCodeSede = codeSede + "";
		String strCodeSubpro = codeSubprograma + "";
		String strCodeBeneficiario = codeBeneficiario + "";

		if (cantidad)// && vigenciaSede)
		{
			SubprogramaService subprogramaService;
			int tamanoinsert = lListaInsertar.size();

			// proceso para insertar en la tabla beneficio otorgado
			String strArr[] = { strCodeSubpro, strCodeBeneficiario,
					strCodeSede, tercero, costoBeneficio, tipoBeneficio,
					strArrIns[0], strArrIns[1], strArrIns[0], strArrIns[1] };

			subprogramaService = new SubprogramaService();
			int insertbienBeneOtorgado = subprogramaService
					.insertBeneficioOtorgado(strArr, i, fechaBeneficio);
			// fin del proceso

			if (tercero == null) {
				sw = true;
			} else {
				if (tercero.equals("")) {
					sw = true;
				}
			}

			// Proceso para actualizar la cantidad disponible
			if (sw) {
				updateBeneficioDisponible(codeSede, codeSubprograma);
			}
			// fin del proceso

			// proceso para calcular el codigo maximo en la tabla beneficio
			// otorgado
			String CodMaxBenefOtor = subprogramaService.findCodMaxBenOtor();
			// fin del proceso

			AtributosService atributosService = new AtributosService();
			for (int j = 0; j < tamanoinsert; j++) {
				Beneficiario_AtributoVO objBenAtri = (Beneficiario_AtributoVO) lListaInsertar
						.get(j);

				if (objBenAtri.getVariable().trim().equals("") == false) {
					System.err
							.println("[BeneficioDAO.OtorgarBeneficios]tipo atributo="
									+ objBenAtri.getTipoatributo());
					if ((objBenAtri.getTipoatributo()).equals("R")) {
						int insertobeneficiarioatri = atributosService
								.insertBeneficiarioAtri(
										objBenAtri.getVariable().trim(),
										objBenAtri.getTipodato(),
										new Long(objBenAtri.getCodigoatributo()),
										new Long(objBenAtri
												.getCodbeneficiario()), i,
										strArrIns);

					} else {
						int insertobeneficioatri = atributosService
								.insertBeneficioAtri(
										objBenAtri.getVariable().trim(),
										objBenAtri.getTipodato(),
										new Long(objBenAtri.getCodigoatributo()),
										new Long(CodMaxBenefOtor), i, strArrIns);
					}
				}
			}
		} else {
			return retorno = false;
		}
		return retorno;
	}

	public boolean updateBOT(Long codeSede, Long codeSubprograma,
			Long codeBeneficiario,
			List<Beneficiario_AtributoVO> lListaInsertar, String tercero,
			int i, String[] strArrIns, String costoBeneficio,
			String fechaBeneficio, Long codeBot, Long codeSedeOld,
			String tipoBot) throws DAOException {
		boolean retorno = true;
		boolean cantidad = false;

		cantidad = (codeSede.longValue() == codeSedeOld.longValue()) ? true
				: checkBeneficio(new Long(codeSede.longValue()),
						codeSubprograma);
		boolean sw = false;
		if (cantidad) {
			SubprogramaService subprogramaService = new SubprogramaService();
			int tamanoinsert = lListaInsertar.size();

			// proceso para actualizar en la tabla beneficio otorgado
			String strArr[] = { codeSede.toString(), tercero, costoBeneficio,
					strArrIns[0], strArrIns[1] };

			int updated = subprogramaService.updateBeneficioOtorgado(strArr, i,
					fechaBeneficio, codeBot.toString());
			// fin del proceso

			if (updated == 1) {
				if (tercero == null) {
					sw = true;
				} else {
					if (tercero.equals("")) {
						sw = true;
					}
				}

				// Proceso para actualizar la cantidad disponible
				if (sw && !codeSede.equals(codeSedeOld)) {
					// Para disminuir en uno el numero de beneficios
					// disponibles en la nueva sede
					updateBeneficioDisponible(codeSede, codeSubprograma);

					// Para aumentar en uno el numero de beneficios
					// disponibles en la nueva sede
					aumentarBeneficioDisponible(codeSedeOld, codeSubprograma);
				}
				// fin del proceso

				AtributosService atributosService = new AtributosService();
				for (int j = 0; j < tamanoinsert; j++) {
					Beneficiario_AtributoVO objBenAtri = (Beneficiario_AtributoVO) lListaInsertar
							.get(j);
					// System.err.println("[BeneficioDAO.UpdateBOT]tipo atributo="
					// + objBenAtri.getTipoatributo());
					if ((objBenAtri.getTipoatributo()).equals("R")) {
						int updatedbeneficiarioatri = atributosService
								.insertBeneficiarioAtri(
										objBenAtri.getVariable().trim(),
										objBenAtri.getTipodato(),
										new Long(objBenAtri.getCodigoatributo()),
										new Long(objBenAtri
												.getCodbeneficiario()), i,
										strArrIns);

					} else {
						int updatedbeneficioatri = atributosService
								.updateBeneficioAtri(
										objBenAtri.getVariable().trim(),
										objBenAtri.getTipodato(),
										new Long(objBenAtri.getCodigoatributo()),
										codeBot, i, strArrIns);

					}
				}
			} else {
				return retorno = false;
			}
		} else {
			return retorno = false;
		}
		return retorno;
	}

	public String findSedeBOT(String codeBot) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT CODSEDE FROM VCS_BENEFICIOS_OTORGADOS "
				+ " WHERE CODBOT = ? ";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, codeBot);
			rst = pstmt.executeQuery();

			rst.next();
			return rst.getString(1);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public Collection<BeneficioVO> findDetallesBeneficios(Long codeBeneficio,
			Long codeSubprograma) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT * FROM VCS_BENEFICIOS_OTORGADOS "
				+ " WHERE CODBEN = ? AND CODSUBPROG = ? ORDER BY CODBOT";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codeBeneficio.longValue());
			pstmt.setLong(2, codeSubprograma.longValue());
			rst = pstmt.executeQuery();

			int Total = 0;
			ArrayList<BeneficioVO> beneficios = new ArrayList<BeneficioVO>();
			while (rst.next()) {
				BeneficioVO beneficioVO = new BeneficioVO();
				beneficioVO.setCode(new Long(rst.getLong("CODSUBPROG")));
				beneficioVO.setNombre(rst.getString("NOMSUBPROG"));
				beneficioVO.setFecha(rst.getString("FECHA"));
				beneficioVO.setCodSede(new Long(rst.getLong("CODSEDE")));
				beneficioVO.setNomSede(rst.getString("NOMSEDE"));
				beneficioVO.setCodeBot(new Long(rst.getLong("CODBOT")));
				beneficioVO.setValor(rst.getInt("Valor"));
				Total += rst.getDouble("Valor");
				beneficios.add(beneficioVO);
			}
			if (beneficios != null && beneficios.size() > 0) {
				BeneficioVO beneficioVO = new BeneficioVO();
				beneficioVO.setCode(new Long("0"));
				beneficioVO.setNombre("TOTAL");
				beneficioVO.setFecha("");
				beneficioVO.setCodSede(new Long("0"));
				beneficioVO.setNomSede("");
				beneficioVO.setCodeBot(new Long("0"));
				beneficioVO.setValor(Total);
				beneficios.add(beneficioVO);
			}
			return beneficios;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public boolean deleteBOT(String codeBOT) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = " SELECT SBPR_CODIGO, SEDE_CODIGO "
				+ " FROM TCS_BEN_BENEFICIO_OTORGADO WHERE CODIGO = ? ";
		String codeSede;
		String codeSub;
		int delete;
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, codeBOT);
			rst = pstmt.executeQuery();
			rst.next();

			codeSede = rst.getString("SEDE_CODIGO");
			codeSub = rst.getString("SBPR_CODIGO");
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}

		query = " DELETE FROM tcs_ben_beneficio_atributo "
				+ " WHERE BOT_CODIGO = ? ";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, codeBOT);
			delete = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}

		query = " DELETE FROM tcs_ben_beneficio_otorgado "
				+ " WHERE codigo = ? ";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, codeBOT);

			delete += pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}

		if (delete > 0) {
			rst = null;
			query = "SELECT MAX(codigo) codigo FROM tcs_ben_subprograma_sede "
					+ " WHERE sbpr_codigo = ? AND sede_codigo = ? ";

			try {
				pstmt = conn.prepareStatement(query);
				pstmt.setString(1, codeSub);
				pstmt.setString(2, codeSede);
				rst = pstmt.executeQuery();

				if (rst.next()) {
					query = "UPDATE  TCS_BEN_SUBPROGRAMA_SEDE "
							+ " SET NUMERO_BEN_DISPONIBLE = NUMERO_BEN_DISPONIBLE + 1 "
							+ " WHERE codigo = " + rst.getString("codigo");
					Statement stmt = null;
					try {
						stmt = conn.createStatement();
						int update = stmt.executeUpdate(query);

						if (update > 0) {
							return true;
						}
					} catch (SQLException e) {
						throw new DAOException(e);
					} finally {
						close(stmt);
					}
				}
			} catch (SQLException e) {
				throw new DAOException(e);
			} finally {
				close(rst, pstmt);
			}
		}
		return false;
	}

	public boolean validarDeleteBOT(String groupUserName, String userName,
			Long codeBOT) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT COUNT(1) cantidad "
				+ " FROM VCS_BENEFICIOS_OTORGADOS "
				+ " WHERE ('ADMINISTRADOR GENERAL' = ? "
				+ " OR 'SUPER USUARIO' = ? "
				+ " OR USUARIOCREA = ? ) AND CODBOT = ? ";

		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, groupUserName);
			pstmt.setString(2, groupUserName);
			pstmt.setString(3, userName);
			pstmt.setLong(4, codeBOT.longValue());
			rst = pstmt.executeQuery();

			if (rst.next()) {
				if (rst.getInt("cantidad") > 0) {
					return true;
				} else {
					return false;
				}
			} else {
				return false;
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public boolean validarEditBOT(String groupUserName, String userName,
			Long codeBOT) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT COUNT(1) cantidad "
				+ " FROM VCS_BENEFICIOS_OTORGADOS"
				+ " WHERE ('ADMINISTRADOR GENERAL' = ? "
				+ " OR 'SUPER USUARIO' = ? "
				+ " OR USUARIOCREA = ? ) AND CODBOT = ? ";

		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, groupUserName);
			pstmt.setString(2, groupUserName);
			pstmt.setString(3, userName);
			pstmt.setLong(4, codeBOT.longValue());
			rst = pstmt.executeQuery();

			if (rst.next()) {
				if (rst.getInt("cantidad") > 0) {
					return true;
				} else {
					return false;
				}
			} else {
				return false;
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	private boolean checkBeneficio(Long codeSede, Long codeSubpro)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		boolean retorno = false;
		if ((Object) codeSede == null || (Object) codeSubpro == null) {
			return retorno;
		}
		StringBuffer query = new StringBuffer(
				"SELECT NUMERO_BEN_DISPONIBLE "
						+ " FROM TCS_BEN_SUBPROGRAMA_SEDE WHERE SEDE_CODIGO = ? AND SBPR_CODIGO = ? ");
		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt.setLong(1, codeSede.longValue());
			pstmt.setLong(2, codeSubpro.longValue());
			rst = pstmt.executeQuery();
			if (rst.next()) {
				int disponibles = rst.getInt("NUMERO_BEN_DISPONIBLE");
				if (disponibles > 0) {
					retorno = true;
				}
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return retorno;
	}

	private boolean updateBeneficioAtributo(Long codeAtributo,
			Long codeBotNuevo, Long codeBotViejo) throws DAOException {
		PreparedStatement pstmt = null;

		String query = "UPDATE TCS_BEN_BENEFICIO_ATRIBUTO SET bot_codigo = ? "
				+ " WHERE BOT_CODIGO = ? AND SAB_CODIGO = ? ";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codeBotNuevo.longValue());
			pstmt.setLong(2, codeBotViejo.longValue());
			pstmt.setLong(3, codeAtributo.longValue());
			int iRegUpdate = pstmt.executeUpdate();
			if (iRegUpdate > 0) {
				return true;
			} else {
				return false;
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
	}

	public void updateBeneficioDisponible(Long codeSede, Long codeSubprograma)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;
		PreparedStatement pstmt2 = null;

		String query = "";
		if ((Object) codeSede != null && (Object) codeSubprograma != null) {
			query = "SELECT MAX(codigo) codigo FROM tcs_ben_subprograma_sede "
					+ " WHERE sbpr_codigo = ? " + " AND sede_codigo = ? ";
			try {
				pstmt = conn.prepareStatement(query);
				pstmt.setLong(1, codeSubprograma.longValue());
				pstmt.setLong(2, codeSede.longValue());
				rst = pstmt.executeQuery();
				if (rst.next()) {
					long codigo = rst.getLong("codigo");
					query = "UPDATE  TCS_BEN_SUBPROGRAMA_SEDE "
							+ " SET NUMERO_BEN_DISPONIBLE = NUMERO_BEN_DISPONIBLE - 1 "
							+ " WHERE codigo = ? ";
					System.out.println("query: " + query);
					pstmt2 = conn.prepareStatement(query);
					pstmt2.setLong(1, codigo);
					int iReg = pstmt2.executeUpdate();
					if (iReg == 0) {
						throw new SQLException();
					}
				}
			} catch (SQLException e) {
				throw new DAOException(e);
			} finally {
				close(pstmt);
				close(pstmt2);
				close(rst);
			}
		}
	}

	// TODO: revisar this shite
	public boolean renewBeneficio(Long codeSubpro, Long codeBeneficiario,
			Long codeOldSede, Long codeNewSede, String fechaOtorgamiento)
			throws DAOException {
		PreparedStatement pstmt = null;

		boolean retorno = true;
		if ((Object) codeSubpro != null && (Object) codeBeneficiario != null
				&& (Object) codeNewSede != null) {

			int iRegInsert = 0;
			if (checkBeneficio(codeNewSede, codeSubpro)) {
				String query = " INSERT INTO TCS_BEN_BENEFICIO_OTORGADO "
						+ " (CODIGO, SBPR_CODIGO, BEN_CODIGO, "
						+ " SEDE_CODIGO, FECHA_BENEFICIO) "
						+ " VALUES (SCS_BEN_BOT.NextVal, ?, ?, ?, TO_CHAR(sysdate,'dd/mm/rrrr')) ";
				try {
					pstmt = conn.prepareStatement(query);
					pstmt.setLong(1, codeSubpro.longValue());
					pstmt.setLong(2, codeBeneficiario.longValue());
					pstmt.setLong(3, codeNewSede.longValue());

					iRegInsert = pstmt.executeUpdate();
				} catch (SQLException e) {
					throw new DAOException(e);
				} finally {
					close(pstmt);
				}
				if (iRegInsert > 0) {
					Statement st = null;
					query = "SELECT SCS_BEN_BOT.currval codigo FROM dual ";
					ResultSet max = null;

					PreparedStatement pstmt2 = null;
					ResultSet rst = null, rst2 = null;

					try {
						st = conn.createStatement();
						max = st.executeQuery(query);
						if (max.next()) {
							Long codeBotNuevo = new Long(max.getLong("codigo"));
							query = "SELECT codigo FROM TCS_BEN_SUBP_ATR_BENEFICIARIO "
									+ " WHERE SBPR_CODIGO = ? "
									+ " AND TIPO_ATRIBUTO = 'B' ";

							pstmt = conn.prepareStatement(query);
							pstmt.setLong(1, codeSubpro.longValue());
							rst = pstmt.executeQuery();
							query = " SELECT codigo "
									+ " FROM TCS_BEN_BENEFICIO_OTORGADO "
									+ " WHERE SBPR_CODIGO = ? "
									+ " AND BEN_CODIGO = ? "
									+ " AND SEDE_CODIGO = ? "
									+ " AND FECHA_BENEFICIO = TO_DATE(?) ";

							pstmt2 = conn.prepareStatement(query);
							pstmt2.setLong(1, codeSubpro.longValue());
							pstmt2.setLong(2, codeBeneficiario.longValue());
							pstmt2.setLong(3, codeOldSede.longValue());
							pstmt2.setString(4, fechaOtorgamiento);
							rst2 = pstmt.executeQuery();

							if (rst2.next()) {
								while (rst.next()) {
									if (updateBeneficioAtributo(
											new Long(rst.getLong("codigo")),
											codeBotNuevo,
											new Long(rst2.getLong("codigo")))) {
										retorno = true;
									} else {
										retorno = false;
										break;
									}
								}
								query = "UPDATE TCS_BEN_BENEFICIO_OTORGADO SET campo_a1 = 'I' WHERE codigo = ? ";
								pstmt = conn.prepareStatement(query);
								pstmt.setLong(1, rst2.getLong("codigo"));

								int iReg = pstmt.executeUpdate();
								if (iReg > 0)
									retorno = true;
								else
									retorno = false;
							} else {
								retorno = false;
							}
						}
					} catch (SQLException e) {
						throw new DAOException(e);
					} finally {
						close(max, st);
						close(rst, pstmt);
						close(rst2, pstmt2);
					}
				} else {
					retorno = false;
				}
			} else {
				retorno = false;
			}
		}
		if (!retorno) {
			try {
				conn.rollback();
			} catch (SQLException e) {

			}
		} else {
			updateBeneficioDisponible(codeNewSede, codeSubpro);
		}
		return retorno;
	}

	private void aumentarBeneficioDisponible(Long codeSede, Long codeSubpro)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "";
		if ((Object) codeSede != null && (Object) codeSubpro != null) {
			query = "SELECT MAX(codigo) codigo FROM tcs_ben_subprograma_sede "
					+ " WHERE sbpr_codigo = ? AND sede_codigo = ? ";

			boolean found = false;
			Long codigo = null;
			try {
				pstmt = conn.prepareStatement(query);
				pstmt.setLong(1, codeSubpro.longValue());
				pstmt.setLong(2, codeSede.longValue());
				rst = pstmt.executeQuery();
				if (rst.next()) {
					found = true;
					codigo = new Long(rst.getLong("codigo"));
				}
			} catch (SQLException e) {
				throw new DAOException(e);
			} finally {
				close(rst, pstmt);
			}
			if (found) {
				query = "UPDATE  TCS_BEN_SUBPROGRAMA_SEDE "
						+ " SET NUMERO_BEN_DISPONIBLE = NUMERO_BEN_DISPONIBLE + 1 "
						+ " WHERE codigo = ? ";
				try {
					pstmt = conn.prepareStatement(query);
					pstmt.setLong(1, codigo.longValue());
					int i = pstmt.executeUpdate();
				} catch (SQLException e) {
					throw new DAOException(e);
				} finally {
					close(pstmt);
				}
			}

		}
	}

	public Collection<UsuarioxSedeVO> findUsuarioxBeneficio(String idben)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT PRG.NOMBRE PROGRAMA,SUB .NOMBRE SUBPROGRAMA,SEDE.NOMBRE, USU.NOMBRE USUARIO "
				+ " FROM TCS_BEN_PROGRAMA PRG, TCS_BEN_SUBPROGRAMA SUB, TCS_BEN_SEDE SEDE, TCS_BEN_SUBPROGRAMA_SEDE SUBSEDE, TCS_BEN_USUARIO_SEDE USUSEDE, PAOYER.TCS_USUARIO USU "
				+ " WHERE PRG.CODIGO = SUB. PRG_CODIGO AND SUB.CODIGO = SUBSEDE. SBPR_CODIGO AND SEDE.CODIGO = SUBSEDE. SEDE_CODIGO AND SUBSEDE.CODIGO = USUSEDE. SPSE_CODIGO AND USU.CODIGO = USUSEDE. USU_CODIGO "
				+ " AND SUB.CODIGO = ? ";

		ArrayList<UsuarioxSedeVO> Usuarios = new ArrayList<UsuarioxSedeVO>();
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, idben);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				UsuarioxSedeVO usu = new UsuarioxSedeVO();
				usu.setNombreUsuario(rst.getString("USUARIO"));
				// usu.setCodeUsuario(new Long(rst.getString("codeusu")));
				usu.setNombrePrograma(rst.getString("PROGRAMA"));
				usu.setNombreSubprograma(rst.getString("SUBPROGRAMA"));
				Usuarios.add(usu);
			}
			return Usuarios;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public String findPrograma(String codeSubprograma) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strSql = "SELECT PRG_CODIGO FROM TCS_BEN_SUBPROGRAMA "
				+ " WHERE CODIGO = ? ";

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, codeSubprograma);
			rst = pstmt.executeQuery();
			rst.next();
			return rst.getString("PRG_CODIGO");
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}

	}
}
